#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <iostream>
#include <vector>
#define N 10
int main()
{
  std::vector<pid_t> subids;
  int i = 0;
  //创建十个进程
  for(;i<N;i++)
  {
    pid_t id =fork();
    if(id ==0)
    {
      int j = 3; 
      while(1)
      {
        printf("我是一个子进程，pid：%d,ppid:%d,count: %d\n",getpid(),getppid(),j);
        sleep(3);
        j--;
        break;
      }
      printf("子进程退出了\n");
      int ret = 1;
      if(ret ==1)
      {
        exit(1);
      }
      else
      {
        exit(0);
      }
    }
    subids.push_back(id);
  }
  sleep(5);
  //父进程
  for(auto &sid :subids)
  {

    int status =0;//保存退出码
    printf("父进程开始等待ing...");
   pid_t rid = waitpid(sid,&status,0);//0->阻塞等待 1->非阻塞等待 等待成功返回pid 失败返回-1
   if(rid > 0)
   {
     int exit_code=(status>>8)&0xFF;
     int exit_signal =status & 0x7F;
     if(exit_code ==0 && exit_signal==0)
     {
       printf("子进程运行正确，结果正确\n");

     }
     else if(exit_code >0 &&exit_signal==0)
     {
       printf("子进程运行完毕，结果不正确：%d:%s\n",exit_code, strerror(exit_code));
     }
     else
     {
       //strerror 是 C 标准库（<string.h>）中的函数，用于将 系统错误码（errno） 转换为对应的错误描述字符串。
        printf("子进程出现异常了, exit_signal: %d\n", exit_signal);
     }
   }
   else
   {
      printf("wait failed\n");
   }

  }
  return 0;
}
